home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / wb / czesc_2 / fakedeficon / fakedeficon.e < prev    next >
Text File  |  1994-06-07  |  9KB  |  335 lines

  1. /* FakeDefIcon.e -- a program to do what Icon should do... */
  2. /* Copyright (c) 1994, Jason R. Hulance */
  3.  
  4. OPT OSVERSION=37
  5.  
  6. MODULE 'exec/ports', 'exec/tasks', 'exec/memory', 'exec/io', 'exec/lists',
  7.        'whatis', 'utility/tagitem', 'utility', 'intuition/intuition',
  8.        'icon', 'dos/dos', 'dos/dosextens', 'workbench/workbench'
  9.  
  10. CONST OFF_EXAM=$ff9a    /* dosbase offset of Examine() */
  11. CONST OFF_EXNEXT=$ff94  /* dosbase offset of ExNext() */
  12. CONST OFF_OPEN=$ffe2    /* dosbase offset of Open() */
  13. CONST OFF_OW=$fda2      /* intuitionbase offset of OpenWindowTagList() */
  14. CONST OFF_ADDG=$fe4a    /* intuitionbase offset of AddGList() */
  15.  
  16. /* WhatIs constants */
  17. CONST CMP_EQUAL=0, TYPE_UNSCANNED=0, TYPE_UNKNOWNFILETYPE=$FFFE,
  18.       TYPE_UNKNOWNIDSTRING=$FFFFFFFF, LIGHTTYPE=0, DEEPTYPE=1,
  19.       WI_FIB=TAG_USER+202, WI_DEEP=TAG_USER+203
  20.  
  21. CONST NOT_FOUND=-1, QUOTE=34
  22.  
  23. ENUM NO_ERR, LIB_ERR, SETF_ERR, ARGS_ERR
  24.  
  25. /* Override the list node definition with a bigger one */
  26. OBJECT ln
  27.   succ, pred
  28.   dum_type:CHAR, dum_pri:CHAR
  29.   name
  30.   type
  31. ENDOBJECT
  32.  
  33. DEF namelist:lh, debug=0, fake, icontype, exetype, win=NIL:PTR TO window
  34.  
  35. RAISE LIB_ERR  IF OpenLibrary()=NIL,
  36.       SETF_ERR IF SetFunction()=NIL,
  37.       ARGS_ERR IF ReadArgs()=NIL
  38.  
  39. PROC main() HANDLE
  40.   DEF old_exam=NIL, old_exnext=NIL, old_open=NIL, old_ow=NIL,
  41.       old_addg=NIL, rdargs=NIL, args:PTR TO LONG
  42.   args:=[0,0]
  43.   rdargs:=ReadArgs('NOFAKE/S,DEBUG/N', args, NIL)
  44.   fake:=Not(args[])
  45.   debug:=args[1]
  46.   IF debug
  47.     debug:=^debug
  48.     IF debug THEN WriteF('')
  49.   ENDIF
  50.   namelist.head:=namelist+4
  51.   namelist.tail:=NIL
  52.   namelist.tailpred:=namelist
  53.   whatisbase:=OpenLibrary('whatis.library', NIL)
  54.   exetype:=GetIDType('Exe')
  55.   icontype:=GetIDType('Icon')
  56.   utilitybase:=OpenLibrary('utility.library', 37)
  57.   iconbase:=OpenLibrary('icon.library', 37)
  58.   old_exam:=SetFunction(dosbase, OFF_EXAM, {new_exam})
  59.   PutLong({patch_exam}, old_exam)
  60.   IF fake
  61.     old_exnext:=SetFunction(dosbase, OFF_EXNEXT, {new_exnext})
  62.     PutLong({patch_exnext}, old_exnext)
  63.     old_open:=SetFunction(dosbase, OFF_OPEN, {new_open})
  64.     PutLong({patch_open}, old_open)
  65.   ENDIF
  66.   old_ow:=SetFunction(intuitionbase, OFF_OW, {new_ow})
  67.   PutLong({patch_ow}, old_ow)
  68.   old_addg:=SetFunction(intuitionbase, OFF_ADDG, {new_addg})
  69.   PutLong({patch_addg}, old_addg)
  70.   LEA store(PC), A0
  71.   MOVE.L A4, (A0)    /* Store the A4 register... */
  72.   Wait(SIGBREAKF_CTRL_C)
  73.   Raise(NO_ERR)
  74. EXCEPT
  75.   IF old_addg THEN SetFunction(intuitionbase, OFF_ADDG, old_addg)
  76.   IF old_ow THEN SetFunction(intuitionbase, OFF_OW, old_ow)
  77.   IF old_open THEN SetFunction(dosbase, OFF_OPEN, old_open)
  78.   IF old_exnext THEN SetFunction(dosbase, OFF_EXNEXT, old_exnext)
  79.   IF old_exam THEN SetFunction(dosbase, OFF_EXAM, old_exam)
  80.   IF iconbase THEN CloseLibrary(iconbase)
  81.   IF utilitybase THEN CloseLibrary(utilitybase)
  82.   IF whatisbase THEN CloseLibrary(whatisbase)
  83.   IF rdargs THEN FreeArgs(rdargs)
  84. ENDPROC
  85.  
  86. PROC freelist()
  87.   DEF n:PTR TO ln
  88.   n:=namelist.head
  89.   WHILE n.succ
  90.     deletenode(n)
  91.     n:=n.succ
  92.   ENDWHILE
  93. ENDPROC
  94.  
  95. PROC deletenode(n:PTR TO ln)
  96.   DisposeLink(n.name)
  97.   Remove(n)
  98.   Dispose(n)
  99. ENDPROC
  100.  
  101. PROC addnode(fib:PTR TO fileinfoblock)
  102.   DEF p:PTR TO ln, s, t
  103.   t:=StrLen(fib.filename)
  104.   s:=String(t+6)
  105.   StringF(s, '\s.info', fib.filename)
  106.   IF p:=Lock(s, ACCESS_READ)
  107.     UnLock(p)
  108.     DisposeLink(s)
  109.   ELSE
  110.     SetStr(s, t)
  111.     t:=WhatIs(s, [WI_DEEP, DEEPTYPE, WI_FIB, fib, NIL])
  112.     IF CmpFileType(t, icontype)<>CMP_EQUAL
  113.       p:=New(SIZEOF ln)
  114.       p.type:=t
  115.       p.name:=s
  116.       IF CmpFileType(t, exetype)<>CMP_EQUAL
  117.         IF IsSubTypeOf(t, exetype)=FALSE
  118.           fib.protection:=fib.protection OR FIBF_EXECUTE
  119.         ENDIF
  120.       ENDIF
  121.       IF debug AND %01
  122.         IF CmpFileType(t, TYPE_UNKNOWNFILETYPE)=CMP_EQUAL
  123.           WriteF('Unknown file type for "\s"\n', p.name)
  124.         ENDIF
  125.       ENDIF
  126.       AddHead(namelist, p)
  127.     ENDIF
  128.   ENDIF
  129. ENDPROC
  130.  
  131. PROC iswb()
  132.   DEF tsk:tc, l:ln
  133.   tsk:=FindTask(NIL)
  134.   IF tsk
  135.     IF l:=tsk.ln
  136.       IF l.name
  137.         IF StrCmp(l.name, 'Workbench', ALL) THEN RETURN tsk
  138.       ENDIF
  139.     ENDIF
  140.   ENDIF
  141. ENDPROC NIL
  142.  
  143. PROC do_exnext()
  144.   DEF fib, r
  145.   MOVE.L D0, r
  146.   MOVE.L D2, fib
  147.   IF iswb()
  148.     IF r=DOSTRUE THEN addnode(fib)
  149.   ENDIF
  150. ENDPROC
  151.  
  152. PROC do_exam()
  153.   IF iswb()
  154.     freelist()
  155.     IF win
  156.       /* This is a horrible, horrible hack... */
  157.       win.extdata:=CurrentDir(0)
  158.       CurrentDir(win.extdata)
  159.       win:=NIL
  160.     ENDIF
  161.   ENDIF
  162. ENDPROC
  163.  
  164. PROC nextname()
  165.   DEF p:PTR TO ln, f:PTR TO ln
  166.   p:=namelist.head
  167.   f:=p
  168.   WHILE p.succ
  169.     IF Stricmp(f.name, p.name)>0 THEN f:=p
  170.     p:=p.succ
  171.   ENDWHILE
  172.   RETURN f
  173. ENDPROC
  174.  
  175. PROC tryfake()
  176.   DEF n, i, t, s:PTR TO ln
  177.   MOVE.L D1, i
  178.   IF iswb() AND StrCmp(i, 'ENV:sys/def_', 12)
  179.     s:=nextname()
  180.     IF s.succ
  181.       t:=GetIconName(s.type)
  182.       IF t[]
  183.         n:=StrLen(t)
  184.         CopyMem(t, i+8, n)
  185.         CopyMem('.info', i+8+n, 6)
  186.         IF debug AND %10
  187.           IF t:=Lock(i, ACCESS_READ)
  188.             UnLock(t)
  189.           ELSE
  190.             WriteF('Couldn''t find icon "\s"\n', i)
  191.           ENDIF
  192.         ENDIF
  193.       ENDIF
  194.       deletenode(s)
  195.     ENDIF
  196.   ENDIF
  197. ENDPROC
  198.  
  199. PROC do_ow()
  200.   DEF w:PTR TO window
  201.   MOVE.L D0, w
  202.   IF iswb()
  203.     win:=w
  204.   ENDIF
  205. ENDPROC
  206.  
  207. PROC do_addglist()
  208.   DEF w:PTR TO window, i:PTR TO diskobject, p:PTR TO process, pw,
  209.       g:PTR TO gadget, si:PTR TO stringinfo, len, dtl=0, iname
  210.   MOVE.L A0, w
  211.   MOVE.L A1, g
  212.   IF p:=iswb()
  213.     IF StrCmp(w.title, 'Execute a File', ALL) AND (w:=w.parent)
  214.       IF w.extdata
  215.         pw:=p.windowptr
  216.         p.windowptr:=-1
  217.         WHILE g
  218.           IF g.gadgettype AND GTYP_STRGADGET
  219.             IF si:=g.specialinfo
  220.               /* Make use of the horrible, horrible hack... */
  221.               dtl:=CurrentDir(w.extdata)
  222.               iname:=GetIconName(WhatIs(si.buffer,[WI_DEEP,DEEPTYPE,NIL]))
  223.               CurrentDir(dtl)
  224.               IF iname[]
  225.                 len:=StrLen(si.buffer)
  226.                 CopyMem(si.buffer, si.undobuffer, len+1)
  227.                 CopyMem('ENV:sys/', si.buffer, 8)
  228.                 CopyMem(iname, si.buffer+8, StrLen(iname)+1)
  229.                 IF i:=GetDiskObject(si.buffer)
  230.                   dtl:=StrLen(i.defaulttool)
  231.                   IF dtl
  232.                     IF InStr(i.defaulttool, ' ', 0)<>NOT_FOUND
  233.                       PutChar(si.buffer, QUOTE)
  234.                       CopyMem(i.defaulttool, si.buffer+1, dtl)
  235.                       CopyMem('" ', si.buffer+dtl+1, 2)
  236.                       dtl:=dtl+3
  237.                     ELSE
  238.                       CopyMem(i.defaulttool, si.buffer, dtl)
  239.                       PutChar(si.buffer+dtl, " ")
  240.                       INC dtl
  241.                     ENDIF
  242.                     IF iname:=FindToolType(i.tooltypes, 'PRE_ARGS')
  243.                       CopyMem(iname, si.buffer+dtl, StrLen(iname))
  244.                       dtl:=dtl+StrLen(iname)
  245.                       PutChar(si.buffer+dtl, " ")
  246.                       INC dtl
  247.                     ENDIF
  248.                     si.bufferpos:=dtl
  249.                     CopyMem(si.undobuffer, si.buffer+dtl, len+1)
  250.                     dtl:=dtl+len
  251.                     IF iname:=FindToolType(i.tooltypes, 'POST_ARGS')
  252.                       PutChar(si.buffer+dtl, " ")
  253.                       INC dtl
  254.                       CopyMem(iname, si.buffer+dtl, StrLen(iname)+1)
  255.                     ENDIF
  256.                   ELSE
  257.                     CopyMem(si.undobuffer, si.buffer, len+1)
  258.                   ENDIF
  259.                   FreeDiskObject(i)
  260.                 ELSE
  261.                   CopyMem(si.undobuffer, si.buffer, len+1)
  262.                 ENDIF
  263.               ENDIF
  264.             ENDIF
  265.             g:=NIL
  266.           ENDIF
  267.           IF g THEN g:=g.nextgadget
  268.         ENDWHILE
  269.         p.windowptr:=pw
  270.       ENDIF
  271.     ENDIF
  272.   ENDIF
  273. ENDPROC
  274.  
  275. /* Place to store A4 register */
  276. store:  LONG 0
  277.  
  278. /* Places to store real library call addresses */
  279. patch_addg:   LONG 0
  280. patch_exam:   LONG 0
  281. patch_exnext: LONG 0
  282. patch_open:   LONG 0
  283. patch_ow:     LONG 0
  284.  
  285. new_addg:
  286.   MOVEM.L D0-D7/A0-A6, -(A7)
  287.   LEA store(PC), A4
  288.   MOVE.L (A4), A4
  289.   do_addglist()
  290.   MOVEM.L (A7)+, D0-D7/A0-A6
  291.   MOVE.L patch_addg(PC), -(A7)
  292.   RTS
  293.  
  294. new_ow:
  295.   PEA start_ow(PC)
  296.   MOVE.L patch_ow(PC), -(A7)
  297.   RTS
  298. start_ow:
  299.   MOVEM.L D0-D7/A0-A6, -(A7)
  300.   LEA store(PC), A4
  301.   MOVE.L (A4), A4
  302.   do_ow()
  303.   MOVEM.L (A7)+, D0-D7/A0-A6
  304.   RTS
  305.  
  306. new_exam:
  307.   MOVEM.L D1-D7/A0-A6, -(A7)
  308.   LEA store(PC), A4
  309.   MOVE.L (A4), A4
  310.   do_exam()
  311.   MOVEM.L (A7)+, D1-D7/A0-A6
  312.   MOVE.L patch_exam(PC), -(A7)
  313.   RTS
  314.  
  315. new_exnext:
  316.   PEA start_exnext(PC)
  317.   MOVE.L patch_exnext(PC), -(A7)
  318.   RTS
  319. start_exnext:
  320.   MOVEM.L D0-D7/A0-A6, -(A7)
  321.   LEA store(PC), A4
  322.   MOVE.L (A4), A4
  323.   do_exnext()
  324.   MOVEM.L (A7)+, D0-D7/A0-A6
  325.   RTS
  326.  
  327. new_open:
  328.   MOVEM.L D1-D7/A0-A6, -(A7)
  329.   LEA store(PC), A4
  330.   MOVE.L (A4), A4
  331.   tryfake()
  332.   MOVEM.L (A7)+, D1-D7/A0-A6
  333.   MOVE.L patch_open(PC), -(A7)
  334.   RTS
  335.